From 1e3df88ee03756a13542f29ac70401acbc948678 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Mon, 3 Aug 2020 21:09:54 -0400 Subject: [PATCH] docs: Redo the doc shooter code Steal snapshotting code from the reftests to make this work again. Other changes here: catch up with container removal. --- docs/tools/meson.build | 2 +- docs/tools/shadow.c | 7 +- docs/tools/shadow.h | 2 +- docs/tools/shooter.c | 327 +++++++++++------------------------------ docs/tools/widgets.c | 249 ++++++++++++++++++------------- 5 files changed, 241 insertions(+), 346 deletions(-) diff --git a/docs/tools/meson.build b/docs/tools/meson.build index a7ec75b447..ead3357af0 100644 --- a/docs/tools/meson.build +++ b/docs/tools/meson.build @@ -1,7 +1,7 @@ if x11_enabled and get_option('gtk_doc') doc_shooter_sources = [ - 'shadow.c', 'shooter.c', + 'shadow.c', 'widgets.c', '../../tests/gtkgears.c', ] diff --git a/docs/tools/shadow.c b/docs/tools/shadow.c index 67c31fe709..20dfdbca13 100644 --- a/docs/tools/shadow.c +++ b/docs/tools/shadow.c @@ -128,12 +128,12 @@ create_shadow (GdkPixbuf *src) } } - + return dest; } GdkPixbuf * -create_shadowed_pixbuf (GdkPixbuf *src) +add_shadow (GdkPixbuf *src) { GdkPixbuf *dest; @@ -145,5 +145,8 @@ create_shadowed_pixbuf (GdkPixbuf *src) gdk_pixbuf_get_height (src), BLUR_RADIUS, BLUR_RADIUS, 1.0, 1.0, GDK_INTERP_NEAREST, 255); + + g_object_unref (src); + return dest; } diff --git a/docs/tools/shadow.h b/docs/tools/shadow.h index 2f569cc349..cb87c504b7 100644 --- a/docs/tools/shadow.h +++ b/docs/tools/shadow.h @@ -3,6 +3,6 @@ #include -GdkPixbuf *create_shadowed_pixbuf (GdkPixbuf *src); +GdkPixbuf *add_shadow (GdkPixbuf *src); #endif /* __SHADOW_H__ */ diff --git a/docs/tools/shooter.c b/docs/tools/shooter.c index 09dea4a26b..b112fbb385 100644 --- a/docs/tools/shooter.c +++ b/docs/tools/shooter.c @@ -21,290 +21,141 @@ #include "widgets.h" #include "shadow.h" -#define MAXIMUM_WM_REPARENTING_DEPTH 4 -#ifndef _ -#define _(x) (x) -#endif - -static void queue_show (void); - -static Window -find_toplevel_window (Window xid) -{ - Window root, parent, *children; - guint nchildren; - - do - { - if (XQueryTree (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), xid, &root, - &parent, &children, &nchildren) == 0) - { - g_warning ("Couldn't find window manager window"); - return 0; - } - - if (root == parent) - return xid; - - xid = parent; - } - while (TRUE); -} - static GdkPixbuf * -add_border_to_shot (GdkPixbuf *pixbuf) +add_border (GdkPixbuf *pixbuf) { GdkPixbuf *retval; - GdkColorspace colorspace; - int bits; - colorspace = gdk_pixbuf_get_colorspace (pixbuf); - bits = gdk_pixbuf_get_bits_per_sample (pixbuf); - retval = gdk_pixbuf_new (colorspace, TRUE, bits, - gdk_pixbuf_get_width (pixbuf) + 2, - gdk_pixbuf_get_height (pixbuf) + 2); + retval = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, + gdk_pixbuf_get_width (pixbuf) + 2, + gdk_pixbuf_get_height (pixbuf) + 2); /* Fill with solid black */ gdk_pixbuf_fill (retval, 0xFF); gdk_pixbuf_copy_area (pixbuf, - 0, 0, - gdk_pixbuf_get_width (pixbuf), - gdk_pixbuf_get_height (pixbuf), - retval, 1, 1); + 0, 0, + gdk_pixbuf_get_width (pixbuf), + gdk_pixbuf_get_height (pixbuf), + retval, 1, 1); + + g_object_unref (pixbuf); return retval; } -static GdkPixbuf * -remove_shaped_area (GdkPixbuf *pixbuf, - Window window) +static GMainLoop *loop; + +static gboolean +quit_when_idle (gpointer loop) { - GdkPixbuf *retval; - XRectangle *rectangles; - int rectangle_count, rectangle_order; - int i; - GdkColorspace colorspace; - int bits; - - colorspace = gdk_pixbuf_get_colorspace (pixbuf); - bits = gdk_pixbuf_get_bits_per_sample (pixbuf); - retval = gdk_pixbuf_new (colorspace, TRUE, bits, - gdk_pixbuf_get_width (pixbuf), - gdk_pixbuf_get_height (pixbuf)); - - gdk_pixbuf_fill (retval, 0); - rectangles = XShapeGetRectangles (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), window, - ShapeBounding, &rectangle_count, &rectangle_order); - - for (i = 0; i < rectangle_count; i++) - { - int y, x; - - for (y = rectangles[i].y; y < rectangles[i].y + rectangles[i].height; y++) - { - guchar *src_pixels, *dest_pixels; - - src_pixels = gdk_pixbuf_get_pixels (pixbuf) + - y * gdk_pixbuf_get_rowstride (pixbuf) + - rectangles[i].x * (gdk_pixbuf_get_has_alpha (pixbuf) ? 4 : 3); - dest_pixels = gdk_pixbuf_get_pixels (retval) + - y * gdk_pixbuf_get_rowstride (retval) + - rectangles[i].x * 4; - - for (x = rectangles[i].x; x < rectangles[i].x + rectangles[i].width; x++) - { - *dest_pixels++ = *src_pixels ++; - *dest_pixels++ = *src_pixels ++; - *dest_pixels++ = *src_pixels ++; - *dest_pixels++ = 255; - - if (gdk_pixbuf_get_has_alpha (pixbuf)) - src_pixels++; - } - } - } + g_main_loop_quit (loop); - return retval; + return G_SOURCE_REMOVE; } -typedef enum { - DECOR_NONE, - DECOR_FRAME, - DECOR_WINDOW_FRAME -} DecorationType; - -static GdkPixbuf * -take_window_shot (Window child, - DecorationType decor) +static void +draw_paintable (GdkPaintable *paintable, + gpointer out_surface) { + GtkSnapshot *snapshot; + GskRenderNode *node; cairo_surface_t *surface; - XWindowAttributes attrs; - Window xid; - Display *dpy; - int x = 0, y = 0; - int width, height; + cairo_t *cr; + + snapshot = gtk_snapshot_new (); + gdk_paintable_snapshot (paintable, + snapshot, + gdk_paintable_get_intrinsic_width (paintable), + gdk_paintable_get_intrinsic_height (paintable)); + node = gtk_snapshot_free_to_node (snapshot); + + /* If the window literally draws nothing, we assume it hasn't been mapped yet and as such + * the invalidations were only side effects of resizes. + */ + if (node == NULL) + return; - GdkPixbuf *tmp, *tmp2; - GdkPixbuf *retval = NULL; + surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, + gdk_paintable_get_intrinsic_width (paintable), + gdk_paintable_get_intrinsic_height (paintable)); - if (decor == DECOR_WINDOW_FRAME) - xid = find_toplevel_window (child); - else - xid = child; + cr = cairo_create (surface); + gsk_render_node_draw (node, cr); + cairo_destroy (cr); + gsk_render_node_unref (node); - dpy = gdk_x11_display_get_xdisplay (gdk_display_get_default ()); - XGetWindowAttributes (dpy, xid, &attrs); + g_signal_handlers_disconnect_by_func (paintable, draw_paintable, out_surface); - width = attrs.width; - height = attrs.height; + *(cairo_surface_t **) out_surface = surface; - if (attrs.x < 0) - { - x = - attrs.x; - width = width + attrs.x; - } + g_idle_add (quit_when_idle, loop); +} - if (attrs.y < 0) - { - y = - attrs.y; - height = height + attrs.y; - } +static cairo_surface_t * +snapshot_widget (GtkWidget *widget) +{ + GdkPaintable *paintable; + cairo_surface_t *surface; - if (attrs.x + x + width > WidthOfScreen (DefaultScreenOfDisplay (dpy))) - width = WidthOfScreen (DefaultScreenOfDisplay (dpy)) - attrs.x - x; + g_assert (gtk_widget_get_realized (widget)); - if (attrs.y + y + height > HeightOfScreen (DefaultScreenOfDisplay (dpy))) - height = HeightOfScreen (DefaultScreenOfDisplay (dpy)) - attrs.y - y; + loop = g_main_loop_new (NULL, FALSE); - surface = cairo_xlib_surface_create (dpy, - xid, - attrs.visual, - attrs.width, - attrs.height); - tmp = gdk_pixbuf_get_from_surface (surface, - x, y, - width, height); - cairo_surface_destroy (surface); + /* We wait until the widget is drawn for the first time. + * + * We also use an inhibit mechanism, to give module functions a chance + * to delay the snapshot. + */ + paintable = gtk_widget_paintable_new (widget); + g_signal_connect (paintable, "invalidate-contents", G_CALLBACK (draw_paintable), &surface); + g_main_loop_run (loop); - if (tmp != NULL) - { - if (decor == DECOR_WINDOW_FRAME) - tmp2 = remove_shaped_area (tmp, xid); - else if (decor == DECOR_FRAME) - tmp2 = add_border_to_shot (tmp); - else - tmp2 = g_object_ref (tmp); - - g_object_unref (tmp); - - if (tmp2 != NULL) - { - retval = create_shadowed_pixbuf (tmp2); - g_object_unref (tmp2); - } - } + g_main_loop_unref (loop); + g_object_unref (paintable); + gtk_window_destroy (GTK_WINDOW (widget)); - return retval; + return surface; } -static GList *toplevels; -static guint shot_id; - -static gboolean -window_is_csd (GdkSurface *window) +int +main (int argc, char **argv) { - return TRUE; -} + GList *toplevels, *node; -static gboolean -shoot_one (WidgetInfo *info) -{ - GdkSurface *window; - XID id; - GdkPixbuf *screenshot = NULL; - DecorationType decor = DECOR_FRAME; + gtk_init (); - if (g_list_find (toplevels, info) == NULL) - { - g_warning ("Widget not found in queue"); - exit (1); - } + toplevels = get_all_widgets (); - window = gtk_native_get_surface (GTK_NATIVE (info->window)); - id = gdk_x11_surface_get_xid (window); - if (window_is_csd (window)) - decor = (info->include_decorations) ? DECOR_NONE : DECOR_WINDOW_FRAME; - screenshot = take_window_shot (id, decor); - if (screenshot != NULL) + for (node = toplevels; node; node = node->next) { + WidgetInfo *info; char *filename; - filename = g_strdup_printf ("./%s.png", info->name); - gdk_pixbuf_save (screenshot, filename, "png", NULL, NULL); - g_free (filename); - g_object_unref (screenshot); - } - else - { - g_warning ("unable to save shot of %s", info->name); - } - gtk_window_destroy (GTK_WINDOW (info->window)); - - shot_id = 0; - - /* remove from the queue and try to load up another */ - toplevels = g_list_remove (toplevels, info); - if (toplevels == NULL) - exit (0); - else - queue_show (); - - return G_SOURCE_REMOVE; -} - -static void -on_show (WidgetInfo *info) -{ - if (shot_id != 0) - return; + cairo_surface_t *surface; + GdkPixbuf *pixbuf; - shot_id = g_timeout_add (500, (GSourceFunc) shoot_one, info); -} + info = node->data; -static gboolean -show_one (void) -{ - WidgetInfo *info = toplevels->data; + gtk_widget_show (info->window); - g_message ("shooting %s", info->name); + surface = snapshot_widget (info->window); - g_signal_connect_swapped (info->window, - "show", - G_CALLBACK (on_show), - info); + pixbuf = gdk_pixbuf_get_from_surface (surface, 0, 0, + cairo_image_surface_get_width (surface), + cairo_image_surface_get_height (surface)); - gtk_widget_show (info->window); + if (!info->include_decorations) + pixbuf = add_border (pixbuf); - return G_SOURCE_REMOVE; -} + pixbuf = add_shadow (pixbuf); -static void -queue_show (void) -{ - g_idle_add ((GSourceFunc) show_one, NULL); -} - -int main (int argc, char **argv) -{ - /* If there's no DISPLAY, we silently error out. We don't want to break - * headless builds. */ - if (! gtk_init_check ()) - return 0; + filename = g_strdup_printf ("./%s.png", info->name); - toplevels = get_all_widgets (); + gdk_pixbuf_save (pixbuf, filename, "png", NULL, NULL); + g_free (filename); - queue_show (); - while (TRUE) - g_main_context_iteration (NULL, TRUE); + g_object_unref (pixbuf); + cairo_surface_destroy (surface); + } return 0; } diff --git a/docs/tools/widgets.c b/docs/tools/widgets.c index 93aeb2ab52..078b90954b 100644 --- a/docs/tools/widgets.c +++ b/docs/tools/widgets.c @@ -17,12 +17,6 @@ #define LARGE_WIDTH 240 #define LARGE_HEIGHT 240 -static gboolean -focus_handled (void) -{ - return TRUE; -} - static WidgetInfo * new_widget_info (const char *name, GtkWidget *widget, @@ -42,27 +36,22 @@ new_widget_info (const char *name, else { info->window = gtk_window_new (); + gtk_window_set_decorated (GTK_WINDOW (info->window), FALSE); info->include_decorations = FALSE; - gtk_widget_show (widget); - gtk_box_append (GTK_BOX (info->window), widget); + gtk_window_set_child (GTK_WINDOW (info->window), widget); } info->no_focus = TRUE; - g_signal_connect (info->window, "focus", G_CALLBACK (focus_handled), NULL); - switch (size) { case SMALL: - gtk_widget_set_size_request (info->window, - 240, 75); + gtk_widget_set_size_request (info->window, 240, 75); break; case MEDIUM: - gtk_widget_set_size_request (info->window, - 240, 165); + gtk_widget_set_size_request (info->window, 240, 165); break; case LARGE: - gtk_widget_set_size_request (info->window, - 240, 240); + gtk_widget_set_size_request (info->window, 240, 240); break; default: break; @@ -71,6 +60,15 @@ new_widget_info (const char *name, return info; } +static void +add_margin (GtkWidget *widget) +{ + gtk_widget_set_margin_start (widget, 10); + gtk_widget_set_margin_end (widget, 10); + gtk_widget_set_margin_top (widget, 10); + gtk_widget_set_margin_bottom (widget, 10); +} + static WidgetInfo * create_button (void) { @@ -79,6 +77,7 @@ create_button (void) widget = gtk_button_new_with_mnemonic ("_Button"); gtk_widget_set_halign (widget, GTK_ALIGN_CENTER); gtk_widget_set_valign (widget, GTK_ALIGN_CENTER); + add_margin (widget); return new_widget_info ("button", widget, SMALL); } @@ -144,14 +143,11 @@ static WidgetInfo * create_menu_button (void) { GtkWidget *widget; - GtkWidget *image; GtkWidget *menu; GtkWidget *vbox; widget = gtk_menu_button_new (); - image = gtk_image_new (); - gtk_image_set_from_icon_name (GTK_IMAGE (image), "emblem-system-symbolic"); - gtk_box_append (GTK_BOX (widget), image); + gtk_menu_button_set_icon_name (GTK_MENU_BUTTON (widget), "emblem-system-symbolic"); menu = gtk_popover_new (); gtk_menu_button_set_popover (GTK_MENU_BUTTON (widget), menu); @@ -162,6 +158,8 @@ create_menu_button (void) gtk_box_append (GTK_BOX (vbox), gtk_label_new ("Menu Button")); + add_margin (vbox); + return new_widget_info ("menu-button", vbox, SMALL); } @@ -210,8 +208,7 @@ create_lockbutton (void) vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 3); gtk_box_append (GTK_BOX (vbox), widget); - gtk_box_append (GTK_BOX (vbox), - gtk_label_new ("Lock Button")); + gtk_box_append (GTK_BOX (vbox), gtk_label_new ("Lock Button")); gtk_widget_set_halign (vbox, GTK_ALIGN_CENTER); gtk_widget_set_valign (vbox, GTK_ALIGN_CENTER); @@ -229,6 +226,8 @@ create_entry (void) gtk_editable_set_text (GTK_EDITABLE (widget), "Entry"); gtk_editable_set_position (GTK_EDITABLE (widget), -1); + add_margin (widget); + return new_widget_info ("entry", widget, SMALL); } @@ -240,7 +239,9 @@ create_search_entry (void) widget = gtk_search_entry_new (); gtk_widget_set_halign (widget, GTK_ALIGN_FILL); gtk_widget_set_valign (widget, GTK_ALIGN_CENTER); - gtk_entry_set_placeholder_text (GTK_ENTRY (widget), "Search..."); + g_object_set (widget, "placeholder-text", "Search…", NULL); + + add_margin (widget); return new_widget_info ("search-entry", widget, SMALL); } @@ -280,19 +281,18 @@ static WidgetInfo * create_accel_label (void) { WidgetInfo *info; - GtkWidget *widget, *button, *box; + GtkWidget *widget, *box; widget = gtk_accel_label_new ("Accel Label"); - - button = gtk_button_new_with_label ("Quit"); - gtk_widget_hide (button); + gtk_widget_set_size_request (widget, 148, -1); box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); gtk_box_append (GTK_BOX (box), widget); - gtk_box_append (GTK_BOX (box), button); gtk_accel_label_set_accel (GTK_ACCEL_LABEL (widget), GDK_KEY_Q, GDK_CONTROL_MASK); + add_margin (box); + info = new_widget_info ("accel-label", box, SMALL); return info; @@ -369,12 +369,13 @@ create_info_bar (void) widget = gtk_info_bar_new (); gtk_info_bar_set_show_close_button (GTK_INFO_BAR (widget), TRUE); gtk_info_bar_set_message_type (GTK_INFO_BAR (widget), GTK_MESSAGE_INFO); - gtk_box_append (GTK_BOX (widget), - gtk_label_new ("Info Bar")); + gtk_info_bar_add_child (GTK_INFO_BAR (widget), gtk_label_new ("Info Bar")); gtk_widget_set_halign (widget, GTK_ALIGN_FILL); gtk_widget_set_valign (widget, GTK_ALIGN_CENTER); + add_margin (widget); + info = new_widget_info ("info-bar", widget, SMALL); return info; @@ -394,8 +395,7 @@ create_search_bar (void) entry = gtk_search_entry_new (); gtk_editable_set_text (GTK_EDITABLE (entry), "Search Bar"); - gtk_box_append (GTK_BOX (widget), entry); - gtk_widget_show (entry); + gtk_search_bar_set_child (GTK_SEARCH_BAR (widget), entry); gtk_search_bar_set_show_close_button (GTK_SEARCH_BAR (widget), TRUE); gtk_search_bar_set_search_mode (GTK_SEARCH_BAR (widget), TRUE); @@ -421,16 +421,15 @@ create_action_bar (void) box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); view = gtk_text_view_new (); + gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (view), FALSE); gtk_box_append (GTK_BOX (box), view); widget = gtk_action_bar_new (); button = gtk_button_new_from_icon_name ("object-select-symbolic"); - gtk_widget_show (button); - gtk_box_append (GTK_BOX (widget), button); + gtk_action_bar_pack_start (GTK_ACTION_BAR (widget), button); button = gtk_button_new_from_icon_name ("call-start-symbolic"); - gtk_widget_show (button); - gtk_box_append (GTK_BOX (widget), button); + gtk_action_bar_pack_start (GTK_ACTION_BAR (widget), button); g_object_set (gtk_widget_get_parent (button), "margin-start", 6, "margin-end", 6, @@ -439,8 +438,6 @@ create_action_bar (void) "spacing", 6, NULL); - gtk_widget_show (widget); - gtk_box_append (GTK_BOX (box), widget); info = new_widget_info ("action-bar", box, SMALL); @@ -456,11 +453,13 @@ create_text_view (void) widget = gtk_frame_new (NULL); text_view = gtk_text_view_new (); - gtk_box_append (GTK_BOX (widget), text_view); - /* Bad hack to add some size to the widget */ + gtk_frame_set_child (GTK_FRAME (widget), text_view); gtk_text_buffer_set_text (gtk_text_view_get_buffer (GTK_TEXT_VIEW (text_view)), - "Multiline\nText\n\n", -1); + "Multiline\nText\n\n", -1); gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (text_view), FALSE); + gtk_widget_set_size_request (text_view, 100, -1); + + add_margin (widget); return new_widget_info ("multiline-text", widget, MEDIUM); } @@ -498,7 +497,7 @@ create_tree_view (void) g_object_new (GTK_TYPE_CELL_RENDERER_TEXT, "xalign", 0.5, NULL), "text", 2, NULL); gtk_tree_view_expand_all (GTK_TREE_VIEW (tree_view)); - gtk_box_append (GTK_BOX (widget), tree_view); + gtk_frame_set_child (GTK_FRAME (widget), tree_view); info = new_widget_info ("list-and-tree", widget, MEDIUM); info->no_focus = FALSE; @@ -516,6 +515,7 @@ create_icon_view (void) GtkTreeIter iter; GdkPixbuf *pixbuf; WidgetInfo *info; + GtkWidget *sw; widget = gtk_frame_new (NULL); list_store = gtk_list_store_new (2, G_TYPE_STRING, GDK_TYPE_PIXBUF); @@ -526,18 +526,27 @@ create_icon_view (void) pixbuf = gdk_pixbuf_new_from_file ("gnome.png", NULL); gtk_list_store_set (list_store, &iter, 0, "Two", 1, pixbuf, -1); - icon_view = gtk_icon_view_new(); + icon_view = gtk_icon_view_new (); + + gtk_icon_view_set_item_orientation (GTK_ICON_VIEW (icon_view), GTK_ORIENTATION_HORIZONTAL); + gtk_icon_view_set_row_spacing (GTK_ICON_VIEW (icon_view), 0); gtk_icon_view_set_model (GTK_ICON_VIEW (icon_view), GTK_TREE_MODEL (list_store)); gtk_icon_view_set_text_column (GTK_ICON_VIEW (icon_view), 0); gtk_icon_view_set_pixbuf_column (GTK_ICON_VIEW (icon_view), 1); - gtk_box_append (GTK_BOX (widget), icon_view); + sw = gtk_scrolled_window_new (); + gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), icon_view); + + gtk_frame_set_child (GTK_FRAME (widget), sw); + + gtk_widget_set_size_request (widget, 96, 128); vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 3); gtk_box_append (GTK_BOX (vbox), widget); - gtk_box_append (GTK_BOX (vbox), - gtk_label_new ("Icon View")); + gtk_box_append (GTK_BOX (vbox), gtk_label_new ("Icon View")); + + add_margin (vbox); info = new_widget_info ("icon-view", vbox, MEDIUM); info->no_focus = FALSE; @@ -553,15 +562,17 @@ create_color_button (void) GdkRGBA color; vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 3); - color.red = 0x1e<<8; /* Go Gagne! */ + color.red = 0x1e<<8; color.green = 0x90<<8; color.blue = 0xff<<8; + color.alpha = 0xffff; picker = gtk_color_button_new_with_rgba (&color); gtk_widget_set_halign (picker, GTK_ALIGN_CENTER); gtk_widget_set_valign (picker, GTK_ALIGN_CENTER); gtk_box_append (GTK_BOX (vbox), picker); - gtk_box_append (GTK_BOX (vbox), - gtk_label_new ("Color Button")); + gtk_box_append (GTK_BOX (vbox), gtk_label_new ("Color Button")); + + add_margin (vbox); return new_widget_info ("color-button", vbox, SMALL); } @@ -577,8 +588,9 @@ create_font_button (void) gtk_widget_set_halign (picker, GTK_ALIGN_CENTER); gtk_widget_set_valign (picker, GTK_ALIGN_CENTER); gtk_box_append (GTK_BOX (vbox), picker); - gtk_box_append (GTK_BOX (vbox), - gtk_label_new ("Font Button")); + gtk_box_append (GTK_BOX (vbox), gtk_label_new ("Font Button")); + + add_margin (vbox); return new_widget_info ("font-button", vbox, SMALL); } @@ -620,10 +632,10 @@ create_file_button (void) gtk_widget_set_halign (picker, GTK_ALIGN_CENTER); gtk_widget_set_valign (picker, GTK_ALIGN_CENTER); gtk_box_append (GTK_BOX (vbox2), picker); - gtk_box_append (GTK_BOX (vbox2), - gtk_label_new ("File Button (Select Folder)")); - gtk_box_append (GTK_BOX (vbox), - vbox2); + gtk_box_append (GTK_BOX (vbox2), gtk_label_new ("File Button (Select Folder)")); + gtk_box_append (GTK_BOX (vbox), vbox2); + + add_margin (vbox); return new_widget_info ("file-button", vbox, MEDIUM); } @@ -633,20 +645,25 @@ create_separator (void) { GtkWidget *hbox; GtkWidget *vbox; + GtkWidget *widget; vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 3); - hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); - gtk_box_set_homogeneous (GTK_BOX (hbox), TRUE); - gtk_box_append (GTK_BOX (hbox), - gtk_separator_new (GTK_ORIENTATION_HORIZONTAL)); - gtk_box_append (GTK_BOX (hbox), - gtk_separator_new (GTK_ORIENTATION_VERTICAL)); + hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10); + gtk_widget_set_halign (hbox, GTK_ALIGN_CENTER); + widget = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL); + gtk_widget_set_size_request (widget, 100, -1); + gtk_widget_set_valign (widget, GTK_ALIGN_CENTER); + gtk_box_append (GTK_BOX (hbox), widget); + widget = gtk_separator_new (GTK_ORIENTATION_VERTICAL); + gtk_widget_set_size_request (widget, -1, 100); + gtk_box_append (GTK_BOX (hbox), widget); gtk_box_append (GTK_BOX (vbox), hbox); - gtk_box_append (GTK_BOX (vbox), - g_object_new (GTK_TYPE_LABEL, - "label", "Horizontal and Vertical\nSeparators", - "justify", GTK_JUSTIFY_CENTER, - NULL)); + gtk_box_append (GTK_BOX (vbox), g_object_new (GTK_TYPE_LABEL, + "label", "Horizontal and Vertical\nSeparators", + "justify", GTK_JUSTIFY_CENTER, + NULL)); + add_margin (vbox); + return new_widget_info ("separator", vbox, MEDIUM); } @@ -673,6 +690,8 @@ create_panes (void) gtk_paned_set_resize_end_child (GTK_PANED (pane), FALSE); gtk_paned_set_shrink_end_child (GTK_PANED (pane), FALSE); + gtk_widget_set_size_request (pane, 96, 96); + gtk_box_append (GTK_BOX (hbox), pane); pane = gtk_paned_new (GTK_ORIENTATION_VERTICAL); @@ -686,14 +705,18 @@ create_panes (void) gtk_paned_set_resize_end_child (GTK_PANED (pane), FALSE); gtk_paned_set_shrink_end_child (GTK_PANED (pane), FALSE); + gtk_widget_set_size_request (pane, 96, 96); + gtk_box_append (GTK_BOX (hbox), pane); gtk_box_append (GTK_BOX (vbox), hbox); - gtk_box_append (GTK_BOX (vbox), - g_object_new (GTK_TYPE_LABEL, - "label", "Horizontal and Vertical\nPanes", - "justify", GTK_JUSTIFY_CENTER, - NULL)); + gtk_box_append (GTK_BOX (vbox), g_object_new (GTK_TYPE_LABEL, + "label", "Horizontal and Vertical\nPanes", + "justify", GTK_JUSTIFY_CENTER, + NULL)); + + add_margin (vbox); + return new_widget_info ("panes", vbox, MEDIUM); } @@ -703,6 +726,9 @@ create_frame (void) GtkWidget *widget; widget = gtk_frame_new ("Frame"); + gtk_widget_set_size_request (widget, 96, 96); + + add_margin (widget); return new_widget_info ("frame", widget, MEDIUM); } @@ -853,8 +879,9 @@ create_progressbar (void) gtk_widget_set_halign (widget, GTK_ALIGN_FILL); gtk_widget_set_valign (widget, GTK_ALIGN_CENTER); gtk_box_append (GTK_BOX (vbox), widget); - gtk_box_append (GTK_BOX (vbox), - gtk_label_new ("Progress Bar")); + gtk_box_append (GTK_BOX (vbox), gtk_label_new ("Progress Bar")); + + add_margin (vbox); return new_widget_info ("progressbar", vbox, SMALL); } @@ -870,8 +897,9 @@ create_level_bar (void) vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 3); gtk_box_append (GTK_BOX (vbox), widget); - gtk_box_append (GTK_BOX (vbox), - gtk_label_new ("Level Bar")); + gtk_box_append (GTK_BOX (vbox), gtk_label_new ("Level Bar")); + + add_margin (vbox); return new_widget_info ("levelbar", vbox, SMALL); } @@ -884,6 +912,7 @@ create_scrolledwindow (void) scrolledwin = gtk_scrolled_window_new (); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwin), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); + gtk_scrolled_window_set_overlay_scrolling (GTK_SCROLLED_WINDOW (scrolledwin), FALSE); label = gtk_label_new ("Scrolled Window"); gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (scrolledwin), label); @@ -904,8 +933,9 @@ create_scrollbar (void) gtk_widget_set_halign (widget, GTK_ALIGN_FILL); gtk_widget_set_valign (widget, GTK_ALIGN_CENTER); gtk_box_append (GTK_BOX (vbox), widget); - gtk_box_append (GTK_BOX (vbox), - gtk_label_new ("Scrollbar")); + gtk_box_append (GTK_BOX (vbox), gtk_label_new ("Scrollbar")); + + add_margin (vbox); return new_widget_info ("scrollbar", vbox, SMALL); } @@ -922,8 +952,9 @@ create_spinbutton (void) gtk_widget_set_halign (widget, GTK_ALIGN_FILL); gtk_widget_set_valign (widget, GTK_ALIGN_CENTER); gtk_box_append (GTK_BOX (vbox), widget); - gtk_box_append (GTK_BOX (vbox), - gtk_label_new ("Spin Button")); + gtk_box_append (GTK_BOX (vbox), gtk_label_new ("Spin Button")); + + add_margin (vbox); return new_widget_info ("spinbutton", vbox, SMALL); } @@ -944,6 +975,8 @@ create_statusbar (void) gtk_box_append (GTK_BOX (vbox), widget); + add_margin (vbox); + info = new_widget_info ("statusbar", vbox, SMALL); return info; @@ -970,6 +1003,8 @@ create_scales (void) "label", "Horizontal and Vertical\nScales", "justify", GTK_JUSTIFY_CENTER, NULL)); + add_margin (vbox); + return new_widget_info ("scales", vbox, MEDIUM);} static WidgetInfo * @@ -985,8 +1020,9 @@ create_image (void) vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 3); gtk_box_append (GTK_BOX (vbox), widget); - gtk_box_append (GTK_BOX (vbox), - gtk_label_new ("Image")); + gtk_box_append (GTK_BOX (vbox), gtk_label_new ("Image")); + + add_margin (vbox); return new_widget_info ("image", vbox, SMALL); } @@ -1005,8 +1041,9 @@ create_spinner (void) gtk_widget_set_halign (widget, GTK_ALIGN_CENTER); gtk_widget_set_valign (widget, GTK_ALIGN_CENTER); gtk_box_append (GTK_BOX (vbox), widget); - gtk_box_append (GTK_BOX (vbox), - gtk_label_new ("Spinner")); + gtk_box_append (GTK_BOX (vbox), gtk_label_new ("Spinner")); + + add_margin (vbox); return new_widget_info ("spinner", vbox, SMALL); } @@ -1022,7 +1059,7 @@ create_volume_button (void) gtk_widget_set_size_request (widget, 100, 250); box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); - gtk_box_append (GTK_BOX (widget), box); + gtk_window_set_child (GTK_WINDOW (widget), box); button = gtk_volume_button_new (); gtk_box_append (GTK_BOX (box), button); @@ -1030,7 +1067,6 @@ create_volume_button (void) gtk_scale_button_set_value (GTK_SCALE_BUTTON (button), 33); popup = gtk_scale_button_get_popup (GTK_SCALE_BUTTON (button)); gtk_widget_realize (widget); - gtk_widget_show (box); gtk_widget_show (popup); return new_widget_info ("volumebutton", widget, ASIS); @@ -1047,14 +1083,12 @@ create_assistant (void) gtk_window_set_title (GTK_WINDOW (widget), "Assistant"); page1 = gtk_label_new ("Assistant"); - gtk_widget_show (page1); gtk_widget_set_size_request (page1, 300, 140); gtk_assistant_prepend_page (GTK_ASSISTANT (widget), page1); gtk_assistant_set_page_title (GTK_ASSISTANT (widget), page1, "Assistant page"); gtk_assistant_set_page_complete (GTK_ASSISTANT (widget), page1, TRUE); page2 = gtk_label_new (NULL); - gtk_widget_show (page2); gtk_assistant_append_page (GTK_ASSISTANT (widget), page2); gtk_assistant_set_page_type (GTK_ASSISTANT (widget), page2, GTK_ASSISTANT_PAGE_CONFIRM); @@ -1075,8 +1109,9 @@ create_appchooserbutton (void) gtk_widget_set_halign (picker, GTK_ALIGN_CENTER); gtk_widget_set_valign (picker, GTK_ALIGN_CENTER); gtk_box_append (GTK_BOX (vbox), picker); - gtk_box_append (GTK_BOX (vbox), - gtk_label_new ("Application Button")); + gtk_box_append (GTK_BOX (vbox), gtk_label_new ("Application Button")); + + add_margin (vbox); return new_widget_info ("appchooserbutton", vbox, SMALL); } @@ -1134,7 +1169,7 @@ create_headerbar (void) window = gtk_window_new (); gtk_window_set_title (GTK_WINDOW (window), "Header Bar"); view = gtk_text_view_new (); - gtk_widget_show (view); + gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (view), FALSE); gtk_widget_set_size_request (window, 220, 150); gtk_window_set_child (GTK_WINDOW (window), view); bar = gtk_header_bar_new (); @@ -1159,10 +1194,8 @@ create_stack (void) gtk_widget_set_margin_bottom (stack, 10); gtk_widget_set_size_request (stack, 120, 120); view = gtk_text_view_new (); - gtk_widget_show (view); gtk_stack_add_titled (GTK_STACK (stack), view, "page1", "Page 1"); view = gtk_text_view_new (); - gtk_widget_show (view); gtk_stack_add_titled (GTK_STACK (stack), view, "page2", "Page 2"); switcher = gtk_stack_switcher_new (); @@ -1192,10 +1225,8 @@ create_stack_switcher (void) gtk_widget_set_margin_bottom (stack, 10); gtk_widget_set_size_request (stack, 120, 120); view = gtk_text_view_new (); - gtk_widget_show (view); gtk_stack_add_titled (GTK_STACK (stack), view, "page1", "Page 1"); view = gtk_text_view_new (); - gtk_widget_show (view); gtk_stack_add_titled (GTK_STACK (stack), view, "page2", "Page 2"); switcher = gtk_stack_switcher_new (); @@ -1227,10 +1258,8 @@ create_sidebar (void) gtk_widget_add_css_class (view, "view"); gtk_widget_set_halign (view, GTK_ALIGN_FILL); gtk_widget_set_valign (view, GTK_ALIGN_FILL); - gtk_widget_show (view); gtk_stack_add_titled (GTK_STACK (stack), view, "page1", "Page 1"); view = gtk_text_view_new (); - gtk_widget_show (view); gtk_stack_add_titled (GTK_STACK (stack), view, "page2", "Page 2"); sidebar = gtk_stack_sidebar_new (); @@ -1290,7 +1319,7 @@ create_list_box (void) gtk_box_append (GTK_BOX (row), button); gtk_list_box_insert (GTK_LIST_BOX (list), row, -1); - gtk_box_append (GTK_BOX (widget), list); + gtk_frame_set_child (GTK_FRAME (widget), list); info = new_widget_info ("list-box", widget, MEDIUM); info->no_focus = FALSE; @@ -1315,19 +1344,19 @@ create_flow_box (void) gtk_flow_box_set_max_children_per_line (GTK_FLOW_BOX (box), 2); gtk_flow_box_set_selection_mode (GTK_FLOW_BOX (box), GTK_SELECTION_BROWSE); button = gtk_label_new ("Child One"); - gtk_box_append (GTK_BOX (box), button); + gtk_flow_box_insert (GTK_FLOW_BOX (box), button, -1); button = gtk_button_new_with_label ("Child Two"); - gtk_box_append (GTK_BOX (box), button); + gtk_flow_box_insert (GTK_FLOW_BOX (box), button, -1); child = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); gtk_box_append (GTK_BOX (child), gtk_label_new ("Child Three")); button = gtk_check_button_new (); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE); gtk_box_append (GTK_BOX (child), button); - gtk_box_append (GTK_BOX (box), child); + gtk_flow_box_insert (GTK_FLOW_BOX (box), child, -1); gtk_flow_box_select_child (GTK_FLOW_BOX (box), GTK_FLOW_BOX_CHILD (gtk_widget_get_parent (child))); - gtk_box_append (GTK_BOX (widget), box); + gtk_frame_set_child (GTK_FRAME (widget), box); vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); @@ -1345,12 +1374,24 @@ create_gl_area (void) WidgetInfo *info; GtkWidget *widget; GtkWidget *gears; + GtkCssProvider *provider; widget = gtk_frame_new (NULL); - gears = gtk_gears_new (); - gtk_box_append (GTK_BOX (widget), gears); - + gtk_widget_add_css_class (gears, "velvet"); + gtk_widget_set_size_request (gears, 96, 96); + gtk_frame_set_child (GTK_FRAME (widget), gears); + + provider = gtk_css_provider_new (); + gtk_css_provider_load_from_data (provider, ".velvet { background: black; }", -1); + gtk_style_context_add_provider (gtk_widget_get_style_context (gears), GTK_STYLE_PROVIDER (provider), 800); + g_object_unref (provider); + + gtk_widget_set_halign (widget, GTK_ALIGN_FILL); + gtk_widget_set_valign (widget, GTK_ALIGN_FILL); + + add_margin (widget); + info = new_widget_info ("glarea", widget, MEDIUM); return info; -- 2.30.2